package com.testing.sqlUtil;

import java.sql.*;
import java.util.*;

/**
 * @Classname MysqlUtils
 * @Description 类型说明
 * @Date 2020/12/29 20:30
 * @Created by 特斯汀Roy
 */
public class MysqlUtils {

    //连接的成员变量，后面的方法都会使用这个创建的连接
    private Connection myconnector;

    //建立连接
    public void createConnector(){
        //1、使用mysql连接驱动jdbc
        try {
            Properties royp=new Properties();
            //读取resources中的文件内容
            royp.load(MysqlUtils.class.getResourceAsStream("/login.properties"));
            String jdbcurl=royp.getProperty("jdbcurl");
            String username=royp.getProperty("username");
            String classname=royp.getProperty("driverclass");
            String password=royp.getProperty("password");
            Class.forName(classname);
            //2、输入ip、端口、数据库名、用户名密码 创建连接
            //url格式： 协议jdbc:mysql:// IP : 端口/连接的数据库名 ？参数配置
            myconnector= DriverManager.getConnection(jdbcurl,username,password);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("mysql数据库连接失败");
        }
    }

    /**
     * 通过输入用户名和密码检查数据库中是否能查询到数据，能查到登录成功，返回true；
     * 不能，登录失败。返回false
     * @param user
     * @param pwd
     */
    public boolean checklogin(String user,String pwd){
        ResultSet resultSet = null;
        try {
            //3、创建查询
            Statement roystatement = myconnector.createStatement();
            //4、编写查询语句
            String sql="select * from userinfo where username='"+user+"' and password='"+pwd+"'";
            //5、执行查询
            resultSet = roystatement.executeQuery(sql);
            //使用短路逻辑运算符，如果resultset为空，就不会执行 resultset.next()，不会出现空指针异常。
            //如果查到数据则说明登录成功，返回true
            if(resultSet!=null&&resultSet.next()){
                return true;
            }
            //否则登陆失败，返回false
            else{
                return false;
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return false;
        }
    }

    /**
     * 使用存储过程，完成登录的校验。
     * @param user
     * @param pwd
     * @return
     */
    public boolean prochecklogin(String user,String pwd){
        ResultSet resultSet = null;
        try {
            //3、创建调用存储过程的查询语句
            //call login(?,?)表示存储过程需要调用两个参数
            CallableStatement callableStatement = myconnector.prepareCall("call login(?,?)");
           //传递参数给存储过程，按照参数的序号进行传递。
            callableStatement.setString(1,user);
            callableStatement.setString(2,pwd);
            //5、执行查询
            resultSet = callableStatement.executeQuery();
            //使用短路逻辑运算符，如果resultset为空，就不会执行 resultset.next()，不会出现空指针异常。
            //如果查到数据则说明登录成功，返回true
            if(resultSet!=null&&resultSet.next()){
                return true;
            }
            //否则登陆失败，返回false
            else{
                return false;
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return false;
        }
    }




    /**
     * 通过输入用户名和密码进行查询，返回查询到的所有结果。
     * @param user
     * @param pwd
     * @return   返回查询到的所有结果 ，格式为List<Map<String,String>>  每个map就是一行数据。
     * @throws SQLException
     */
    public List<Map<String,String>> queryResult(String user,String pwd) throws SQLException {
        //3、创建查询
        Statement roystatement = myconnector.createStatement();
        //4、编写查询语句
        String sql="select * from userinfo where username='"+user+"' and password='"+pwd+"'";
        //5、执行查询
        ResultSet resultSet = roystatement.executeQuery(sql);
        ResultSetMetaData thead = resultSet.getMetaData();
        //查询到的数据不止一条?怎么办？
        //使用一个list，把所有的map都存起来。
        List<Map<String,String>> resultlist=new ArrayList<>();
        //使用循环，读取resultSet中的每一行，通过next()取值。
        while(resultSet.next()){
            //循环中，每获取一次数据，创建一个新的map来存这一行的值
            //一行信息存储到map中
            Map<String,String> resultmap=new HashMap<>();
            //遍历表头信息的每一列，获取列名和值。
            for(int column=1;column<=thead.getColumnCount();column++){
                resultmap.put(thead.getColumnName(column),resultSet.getString(column));
            }
            //将每一行的数据map存到list里面
            resultlist.add(resultmap);
        }
        return resultlist;
    }

    /**
     *  查询已经登录的用户的数据，默认只有一条。
     * @param user
     * @return
     * @throws SQLException
     */
    public Map<String,String> getUserinfo(String user)  {
        try {
            //3、创建查询
            Statement roystatement = myconnector.createStatement();
            //4、编写查询语句
            String sql="select * from userinfo where username='"+user+"'";
            //5、执行查询
            ResultSet resultSet = roystatement.executeQuery(sql);
            ResultSetMetaData thead = resultSet.getMetaData();
            Map<String,String> resultmap=new HashMap<>();
            while(resultSet.next()){
                //遍历表头信息的每一列，获取列名和值。
                for(int column=1;column<=thead.getColumnCount();column++){
                    resultmap.put(thead.getColumnName(column),resultSet.getString(column));
                }
            }
            return resultmap;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }
    }


}
